#include "audio_dataset.h"

#include <unicode/utext.h>
#include <unicode/ustring.h>
#include <unicode/unistr.h> // ICU 的 UnicodeString
#include <unicode/uchar.h>  // ICU 的字符属性函数
#include <unicode/uniset.h> // icu::UnicodeSet

#include "conf.h"

#include <iostream>

#define SENTENCE_THRESHOLD    8


AudioDataset::AudioDataset() = default;


void AudioDataset::append(const std::string& input) {
    buffer_ += icu::UnicodeString::fromUTF8(input);
}


std::string AudioDataset::nextSentence(bool &is_deal) {

    // sys_log("position: %d, size: %d, done: %s", 
    //     position_, buffer_.length(), post_done_ ? "true": "false");

    if (post_done_) {
        is_deal = true;  // 如果是完成的话，强制线程一直 nextSentece 来输出和转换
    }

    if (size() < 8 && !post_done_) {
        return "";
    }

    // 对每一个 utf-16 元
    for (int end = position_; end < buffer_.length(); ++end) {

        // 查看 utf-16 元的值
        UChar c = buffer_.charAt(end);

        if (c == 0xFF0C || c == 0x3002 || c == 0xFF1B || c == 0xFF1A || 
            c == 0xFF1F || c == 0xFF01) {
            // 0xFF0C: '，'
            // 0x3002: '。'
            // 0xFF1B: '；'
            // 0xFF1A: '：'
            // 0xFF1F: '？'
            // 0xFF01: '！'

            // 拷贝出从 position_ 起始位置 到 当前位置的子串
            // 左闭右开，所以 end + 1 , 同时使 end 指向下一句话的起始位置
            icu::UnicodeString sentence = buffer_.tempSubStringBetween(
                position_, ++end);

            // 遍历字符串并删除所有数字字符
            // int32_t length = sentence.length();
            // for (int32_t i = length - 1; i >= 0; --i) {  // 逆序删除避免索引错误
            //     if (u_isdigit(sentence.char32At(i))) {
            //         sentence.remove(i, 1);  // 删除该字符
            //     }
            // }

            // 创建一个包含特殊字符的 UnicodeSet
            icu::UnicodeSet specialChars;
            specialChars.addAll(icu::UnicodeString("（）-；\"“”@#$^&*(){}[];:',<>/\\|`~"));
            // specialChars.addAll(icu::UnicodeString("，。-；\"“”@#$^&*(){}[];:',<>/\\|`~"));

            // 删除特殊字符
            for (int32_t i = 0; i < sentence.length(); ) {
                UChar32 ch = sentence.char32At(i); // 获取当前字符（支持 UTF-16 代理对）
                if (specialChars.contains(ch)) {
                    sentence.remove(i, 1); // 删除特殊字符
                } else {
                    i += U16_LENGTH(ch); // 移动到下一个字符
                }
            }

            // 将下一个字符的位置 赋值给 postion_ 进行记录
            position_ = end;

            // 当 解析到最后一句的时候， end指向最大索引(buffer_length() -1)的下一个位置
            // 也就是 (buffer_length() - 1) + 1 = buffer_length()
            if (end >= buffer_.length()) {
                if (postDone()) {
                    sys_log("audio dataset reset.");
                    reset();
                }

            } else {
                // 后面还有内容 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                // 如果字数太少的话，忽略掉这个分割，寻找下一个分割点
                // if (position_ - start + 1 < SENTENCE_THRESHOLD) {
                //     continue;
                // }

            }
            
            // 将 UnicodeString 转为 UTF-8 字符串并返回
            std::string utf8Sentence;
            sentence.toUTF8String(utf8Sentence);
            // sys_log("get utf8 sentence:%s", utf8Sentence.c_str());

            // 如果是第一次返回sentence的话，继续进行下一次
            is_deal = true;
            return utf8Sentence;
        }
    }

    warn_log("can not find '，' or '。' in text buffer.");
    // sys_log("after: position: %d, size: %d", position_, buffer_.length());

    return ""; // 没有完整句子返回空字符串
}


void AudioDataset::reset() {
    buffer_.remove();
    position_ = 0;
    post_done_ = false;
}
